﻿using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;

namespace ECommon
{
    /// <summary>
    /// 网络工具类
    /// </summary>
    public static class NetTool
    {
        /// <summary>
        /// 获取IP地址列表
        /// </summary>
        /// <returns>可用的IP v4的IP地址列表</returns>
        public static List<IPAddress> GetIpAddress()
        {
            List<IPAddress> res = new List<IPAddress>();
            // 获取所有网络接口的消息
            foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
            {
                // 检查网络接口是否启用且不是回环接口（例如，不是localhost）
                if (nic.OperationalStatus == OperationalStatus.Up && nic.NetworkInterfaceType != NetworkInterfaceType.Loopback)
                {
                    var properties = nic.GetIPProperties();
                    // 获取IPv4地址（如果有的话）
                    foreach (UnicastIPAddressInformation unicastAddress in properties.UnicastAddresses)
                    {
                        if (unicastAddress.Address.AddressFamily == AddressFamily.InterNetwork) // IPv4地址
                        {
                            res.Add(unicastAddress.Address);
                        }
                        // 如果需要IPv6地址，可以取消注释以下代码行：
                        // else if (unicastAddress.Address.AddressFamily == AddressFamily.InterNetworkV6) // IPv6地址 
                        // { 
                        //     Console.WriteLine(unicastAddress.Address.ToString()); 
                        // } 
                    }
                }
            }
            return res;
        }

        /// <summary>
        /// 获取一个Mac地址
        /// </summary>
        /// <returns>第一个Mac地址</returns>
        public static string GetMacString()
        {
            // 获取所有网络接口
            NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces();

            // 遍历接口，找到第一个正在使用的Mac地址（OperationalStatus == Up 表示接口正在使用中）
            foreach (NetworkInterface item in interfaces)
            {
                if (item.OperationalStatus == OperationalStatus.Up)
                {
                    return BitConverter.ToString(item.GetPhysicalAddress().GetAddressBytes());
                }
            }
            return "";
        }

        /// <summary>
        /// 获取一个Mac地址
        /// </summary>
        /// <returns>第一个Mac地址</returns>
        public static string GetMacStringNoSplit()
        {
            return GetMacString().Replace("-", "").Replace(":", "").ToUpper();
        }

        /// <summary>
        /// 获取一个Mac地址
        /// </summary>
        /// <returns>第一个Mac地址</returns>
        public static long GetMacLong()
        {
            string macStr = GetMacString();
            if (string.IsNullOrWhiteSpace(macStr))
            {
                return 0;
            }
            if (!StringTool.RegexIsMac(macStr))
            {
                return 0;
            }
            string[] parts = macStr.Split(new char[] { '-', ':' }, StringSplitOptions.RemoveEmptyEntries);
            if (parts.Length != 6)
            {
                return 0;
            }
            List<byte> bytes = new List<byte>();
            for (int i = 0; i < 6; i++)
            {
                bytes.Add(Convert.ToByte(parts[i], 16));
            }
            bytes.Add(0);
            bytes.Add(0);
            return BitConverter.ToInt64(bytes.ToArray(), 0);
        }
    }
}
